import time
import logging
from datetime import datetime
from kubernetes import client, config

# 全局日志记录器
logger = logging.getLogger('k8s_event_monitor')


def setup_logging(log_to_file=False, log_file='k8s_events.log'):
    """配置日志记录器"""
    # 清除之前的处理器
    for handler in logger.handlers[:]:
        logger.removeHandler(handler)
        handler.close()

    # 设置日志级别
    logger.setLevel(logging.INFO)

    # 创建格式化器
    formatter = logging.Formatter(
        '%(asctime)s - %(levelname)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )

    # 控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(formatter)
    logger.addHandler(console_handler)

    # 文件处理器（如果启用）
    if log_to_file:
        file_handler = logging.FileHandler(log_file)
        file_handler.setFormatter(formatter)
        logger.addHandler(file_handler)

    return logger


def get_recent_events(interval_minutes=1, namespace=None, log_to_file=False):
    """
    定时获取Kubernetes事件信息
    :param interval_minutes: 获取间隔时间(分钟)
    :param namespace: 指定命名空间，None表示所有命名空间
    :param log_to_file: 是否将日志写入文件
    """
    # 配置日志
    setup_logging(log_to_file)

    # 加载kube配置
    try:
        config.load_kube_config(config_file="kube/config")
    except:
        config.load_incluster_config()

    v1 = client.CoreV1Api()
    last_check_time = datetime.utcnow()

    logger.info(f"开始定时获取Kubernetes事件，间隔{interval_minutes}分钟...")
    logger.info("=" * 80)

    while True:
        try:
            current_time = datetime.utcnow()
            logger.info(f"\n当前时间：[ {datetime.now()} ]")
            logger.info(f"\n检查时间范围: {last_check_time} - {current_time}")
            logger.info("-" * 60)

            # 获取事件列表
            if namespace:
                events = v1.list_namespaced_event(namespace)
            else:
                events = v1.list_event_for_all_namespaces()

            # 筛选并打印最近interval_minutes分钟内的事件
            new_events = []
            for event in events.items:
                event_time = event.last_timestamp or event.event_time or event.metadata.creation_timestamp
                if event_time and event_time.replace(tzinfo=None) > last_check_time:
                    new_events.append(event)

            if not new_events:
                logger.info("没有新事件")
            else:
                # 按时间排序
                new_events.sort(key=lambda e: (e.last_timestamp or e.event_time or e.metadata.creation_timestamp))
                for event in new_events:
                    print_event(event)

            # 更新最后检查时间并等待下一个周期
            last_check_time = current_time
            time.sleep(interval_minutes * 60)

        except Exception as e:
            logger.error(f"获取事件时出错: {str(e)}")
            time.sleep(30)  # 出错后等待30秒再重试


def print_event(event):
    """格式化打印事件信息"""
    event_time = event.last_timestamp or event.event_time or event.metadata.creation_timestamp
    obj_ref = f"{event.involved_object.kind}/{event.involved_object.name}" if event.involved_object else "Unknown"
    message = f"{event_time} {event.type:7} {event.reason:20} {obj_ref:30} {event.message}"
    logger.info(message)


if __name__ == "__main__":
    # 每隔3分钟检查一次，可以调整interval_minutes参数
    # 可以指定namespace如namespace="default"
    # 启用文件日志：设置log_to_file=True
    get_recent_events(
        interval_minutes=1,
        namespace=None,
        log_to_file=False  # 设置为True启用文件日志
    )